"""
分析报告生成模块 (Report Generator)

将用户画像分析结果生成易读的 Markdown 报告。
"""

from datetime import datetime
from typing import Dict, Any, List


class ReportGenerator:
    """分析报告生成器"""

    def generate_markdown_report(
        self,
        sessions: List[Dict[str, Any]],
        url_stats: List[Dict[str, Any]],
        profile: Dict[str, Any],
        events_count: int
    ) -> str:
        """
        生成 Markdown 格式的分析报告

        Args:
            sessions: 会话列表
            url_stats: URL 统计
            profile: 用户画像
            events_count: 总事件数

        Returns:
            Markdown 格式的报告文本
        """
        report = []

        # 标题
        report.append("# 用户行为分析报告")
        report.append("")
        report.append(f"**生成时间**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        report.append(f"**分析事件数**: {events_count} 个")
        report.append(f"**会话数**: {len(sessions)} 个")
        report.append("")
        report.append("---")
        report.append("")

        # 1. 用户画像总结
        report.append("## 📊 用户画像总结")
        report.append("")

        occupation = profile.get('occupation', '未识别')
        confidence = profile.get('confidence', 0)
        confidence_emoji = "🟢" if confidence > 0.8 else "🟡" if confidence > 0.6 else "🔴"

        report.append(f"### 职业/角色")
        report.append(f"**{occupation}** {confidence_emoji} (置信度: {confidence:.0%})")
        report.append("")

        # 技能
        skills = profile.get('skills', [])
        if skills:
            report.append(f"### 技能栈")
            for skill in skills:
                report.append(f"- {skill}")
            report.append("")

        # 兴趣
        interests = profile.get('interests', [])
        if interests:
            report.append(f"### 兴趣领域")
            for interest in interests:
                report.append(f"- {interest}")
            report.append("")

        # 当前任务
        current_task = profile.get('current_task', '')
        if current_task:
            report.append(f"### 当前任务/目标")
            report.append(f"{current_task}")
            report.append("")

        # 分析依据
        reasoning = profile.get('reasoning', '')
        if reasoning:
            report.append(f"### 分析依据")
            report.append(f"> {reasoning}")
            report.append("")

        report.append("---")
        report.append("")

        # 2. 兴趣深度分类
        interest_depth = profile.get('interest_depth', {})
        if interest_depth:
            report.append("## 🎯 兴趣深度分类")
            report.append("")

            core = interest_depth.get('core_interests', [])
            if core:
                report.append("### 🔥 核心兴趣（深度关注）")
                for item in core:
                    report.append(f"- {item}")
                report.append("")

            moderate = interest_depth.get('moderate_interests', [])
            if moderate:
                report.append("### ⭐ 中等兴趣（一定关注）")
                for item in moderate:
                    report.append(f"- {item}")
                report.append("")

            low = interest_depth.get('low_interests', [])
            if low:
                report.append("### 👀 浅层浏览（快速浏览）")
                for item in low:
                    report.append(f"- {item}")
                report.append("")

            report.append("---")
            report.append("")

        # 3. 会话详情
        report.append("## 🕒 会话详情")
        report.append("")

        for i, session in enumerate(sessions, 1):
            duration_min = session['duration_sec'] / 60
            is_main = ' 🌟 **主要会话**' if duration_min > 1 else ''

            report.append(f"### 会话 {i}{is_main}")
            report.append(f"- **时间**: {session['start_time_str']} - {session['end_time_str']}")
            report.append(f"- **持续时间**: {session['duration_sec']} 秒 ({duration_min:.1f} 分钟)")
            report.append(f"- **事件数**: {session['event_count']} 个")

            # 事件类型分布
            event_types = ', '.join(f"{k}×{v}" for k, v in session['event_types'].items())
            report.append(f"- **事件类型**: {event_types}")

            # 访问的页面
            report.append(f"- **访问页面**:")
            for url in session['urls']:
                url_stat = next((s for s in url_stats if s['url'] == url), None)
                if url_stat:
                    title = url_stat['titles'][0] if url_stat['titles'] else 'N/A'

                    # 找到该 URL 在当前会话的停留时间
                    session_visit = next(
                        (v for v in url_stat['visit_sessions'] if v['session_id'] == session['session_id']),
                        None
                    )
                    duration = session_visit['duration_sec'] if session_visit else 0

                    report.append(f"  - `{url}`")
                    report.append(f"    - 标题: {title}")
                    report.append(f"    - 停留: {duration} 秒")
                else:
                    report.append(f"  - `{url}`")

            report.append("")

        report.append("---")
        report.append("")

        # 4. URL 访问统计
        report.append("## 📈 URL 访问统计")
        report.append("")

        # 按总停留时间排序
        sorted_urls = sorted(url_stats, key=lambda x: x['total_duration_sec'], reverse=True)

        report.append("| URL | 标题 | 访问次数 | 总停留 | 平均停留 | 事件数 |")
        report.append("|-----|------|---------|-------|---------|-------|")

        for url_stat in sorted_urls[:15]:  # 只显示前15个
            url = url_stat['url']
            # 截断过长的 URL
            if len(url) > 50:
                url = url[:47] + '...'

            title = url_stat['titles'][0] if url_stat['titles'] else 'N/A'
            # 截断过长的标题
            if len(title) > 30:
                title = title[:27] + '...'

            visit_count = url_stat['visit_count']
            total_duration = url_stat['total_duration_sec']
            avg_duration = url_stat['avg_duration_sec']
            event_count = url_stat['event_count']

            report.append(
                f"| {url} | {title} | {visit_count} | {total_duration}s | {avg_duration}s | {event_count} |"
            )

        report.append("")
        report.append("---")
        report.append("")

        # 5. 数据质量评估
        report.append("## 📋 数据质量评估")
        report.append("")

        # 会话完整性
        total_session_time = sum(s['duration_sec'] for s in sessions)
        avg_session_time = total_session_time / len(sessions) if sessions else 0

        report.append(f"- **总会话时长**: {total_session_time} 秒 ({total_session_time / 60:.1f} 分钟)")
        report.append(f"- **平均会话时长**: {avg_session_time:.1f} 秒")
        report.append(f"- **平均每会话事件数**: {events_count / len(sessions):.1f} 个")
        report.append("")

        # 交互深度评估
        interactive_events = sum(
            s['event_types'].get('click', 0) +
            s['event_types'].get('input', 0) +
            s['event_types'].get('paste', 0) +
            s['event_types'].get('keydown', 0)
            for s in sessions
        )
        interactive_ratio = interactive_events / events_count if events_count > 0 else 0

        report.append(f"- **主动交互事件数**: {interactive_events} / {events_count} ({interactive_ratio:.1%})")
        report.append(f"  - 主动交互包括: click, input, paste, keydown")
        report.append("")

        # 数据可信度
        if events_count < 20:
            data_quality = "🔴 数据量较少，分析结果可信度较低"
        elif events_count < 50:
            data_quality = "🟡 数据量适中，分析结果有一定参考价值"
        else:
            data_quality = "🟢 数据量充足，分析结果可信度较高"

        report.append(f"- **数据可信度**: {data_quality}")
        report.append("")

        report.append("---")
        report.append("")

        # 结尾
        report.append("## 💡 后续建议")
        report.append("")
        report.append("### 分析效果优化")
        report.append("- 当前使用 **Stage 1 (基础内容分析)**，基于 URL + Title + 停留时间")
        report.append("- 如需更深入分析（如点赞帖子内容、文章段落等），可升级到 **Stage 2 (深度内容提取)**")
        report.append("")
        report.append("### 数据积累")
        report.append("- 建议持续收集用户行为数据（目标：至少 100+ 事件/用户）")
        report.append("- 跨多天数据可以更准确地识别用户兴趣的稳定性")
        report.append("")
        report.append("---")
        report.append("")
        report.append("*报告由 browse-etl 用户偏好分析系统自动生成*")

        return '\n'.join(report)

    def generate_json_report(
        self,
        sessions: List[Dict[str, Any]],
        url_stats: List[Dict[str, Any]],
        profile: Dict[str, Any],
        events_count: int
    ) -> Dict[str, Any]:
        """
        生成 JSON 格式的分析报告

        Args:
            sessions: 会话列表
            url_stats: URL 统计
            profile: 用户画像
            events_count: 总事件数

        Returns:
            JSON 格式的报告字典
        """
        return {
            'metadata': {
                'generated_at': datetime.now().isoformat(),
                'events_count': events_count,
                'sessions_count': len(sessions),
                'analysis_version': 'Stage 1 (基础内容分析)'
            },
            'user_profile': profile,
            'sessions': sessions,
            'url_statistics': url_stats,
            'quality_metrics': {
                'total_session_time_sec': sum(s['duration_sec'] for s in sessions),
                'avg_session_time_sec': sum(s['duration_sec'] for s in sessions) / len(sessions) if sessions else 0,
                'interactive_events_ratio': self._calculate_interactive_ratio(sessions, events_count),
                'data_quality_level': self._assess_data_quality(events_count)
            }
        }

    def _calculate_interactive_ratio(self, sessions: List[Dict[str, Any]], total_events: int) -> float:
        """计算主动交互事件占比"""
        interactive_events = sum(
            s['event_types'].get('click', 0) +
            s['event_types'].get('input', 0) +
            s['event_types'].get('paste', 0) +
            s['event_types'].get('keydown', 0)
            for s in sessions
        )
        return interactive_events / total_events if total_events > 0 else 0

    def _assess_data_quality(self, events_count: int) -> str:
        """评估数据质量等级"""
        if events_count < 20:
            return 'low'
        elif events_count < 50:
            return 'medium'
        else:
            return 'high'
